
The following examples show how to find a mover's position at a certain time or for a certain time span.
import pandas as pd
import geopandas as gpd
import movingpandas as mpd
import shapely as shp
import hvplot.pandas
from geopandas import GeoDataFrame, read_file
from shapely.geometry import Point, LineString, Polygon
from datetime import datetime, timedelta
from holoviews import opts
import warnings
warnings.filterwarnings('ignore')
opts.defaults(opts.Overlay(active_tools=['wheel_zoom'], frame_width=500, frame_height=400))
mpd.show_versions()
MovingPandas 0.11.rc1 SYSTEM INFO ----------- python : 3.9.13 | packaged by conda-forge | (main, May 27 2022, 16:50:36) [MSC v.1929 64 bit (AMD64)] executable : H:\miniconda3\envs\movingpandas\python.exe machine : Windows-10-10.0.19043-SP0 GEOS, GDAL, PROJ INFO --------------------- GEOS : None GEOS lib : None GDAL : 3.5.0 GDAL data dir: None PROJ : 9.0.0 PROJ data dir: H:\miniconda3\pkgs\proj-9.0.0-h1cfcee9_1\Library\share\proj PYTHON DEPENDENCIES ------------------- geopandas : 0.11.1 pandas : 1.4.3 fiona : 1.8.21 numpy : 1.23.1 shapely : 1.8.2 rtree : 1.0.0 pyproj : 3.3.0 matplotlib : 3.5.2 mapclassify: 2.4.3 geopy : 2.2.0 holoviews : 1.14.8 hvplot : 0.8.0 geoviews : 1.9.5 stonesoup : 0.1b9
First, let's create a basic trajectory:
df = pd.DataFrame([
{'geometry':Point(0,0), 't':datetime(2018,1,1,12,0,0)},
{'geometry':Point(6,0), 't':datetime(2018,1,1,12,6,0)},
{'geometry':Point(6,6), 't':datetime(2018,1,1,12,10,0)},
{'geometry':Point(9,9), 't':datetime(2018,1,1,12,15,0)}
]).set_index('t')
gdf = GeoDataFrame(df, crs=31256)
toy_traj = mpd.Trajectory(gdf, 1)
toy_traj
Trajectory 1 (2018-01-01 12:00:00 to 2018-01-01 12:15:00) | Size: 4 | Length: 16.2m Bounds: (0.0, 0.0, 9.0, 9.0) LINESTRING (0 0, 6 0, 6 6, 9 9)
When we call this method, the resulting point is directly rendered:
toy_traj.get_position_at(datetime(2018,1,1,12,6,0), method="nearest")
To see its coordinates, we can look at the print output:
print(toy_traj.get_position_at(datetime(2018,1,1,12,6,0), method="nearest"))
POINT (6 0)
The method parameter describes what the function should do if there is no entry in the trajectory GeoDataFrame for the specified timestamp.
For example, there is no entry at 2018-01-01 12:07:00
toy_traj.df
| geometry | |
|---|---|
| t | |
| 2018-01-01 12:00:00 | POINT (0.000 0.000) |
| 2018-01-01 12:06:00 | POINT (6.000 0.000) |
| 2018-01-01 12:10:00 | POINT (6.000 6.000) |
| 2018-01-01 12:15:00 | POINT (9.000 9.000) |
t = datetime(2018,1,1,12,7,0)
print(toy_traj.get_position_at(t, method="nearest"))
print(toy_traj.get_position_at(t, method="interpolated"))
print(toy_traj.get_position_at(t, method="ffill")) # from the previous row
print(toy_traj.get_position_at(t, method="bfill")) # from the following row
POINT (6 0) POINT (6 1.5) POINT (6 0) POINT (6 6)
point = toy_traj.get_position_at(t, method="interpolated")
df = pd.DataFrame([{'id': toy_traj.id, 'geometry': point, 't': t}])
gdf = GeoDataFrame(df, crs=toy_traj.crs)
ax = toy_traj.plot()
gdf.plot(ax=ax, color='red', markersize=100)
<AxesSubplot:>
First, let's extract the trajectory segment for a certain time period:
segment = toy_traj.get_segment_between(datetime(2018,1,1,12,6,0), datetime(2018,1,1,12,12,0))
print(segment)
Trajectory 1_2018-01-01 12:06:00 (2018-01-01 12:06:00 to 2018-01-01 12:10:00) | Size: 2 | Length: 6.0m Bounds: (6.0, 0.0, 6.0, 6.0) LINESTRING (6 0, 6 6)
ax = toy_traj.plot()
segment.plot(ax=ax, color='red', linewidth=5)
<AxesSubplot:>
Now, let's extract the trajectory segment that intersects with a given polygon:
xmin, xmax, ymin, ymax = 2, 8, -10, 5
polygon = Polygon([(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)])
polygon
polygon_gdf = GeoDataFrame(pd.DataFrame([{'geometry':polygon, 'id':1}]), crs=31256)
intersections = toy_traj.clip(polygon)
intersections
TrajectoryCollection with 1 trajectories
ax = toy_traj.plot()
polygon_gdf.plot(ax=ax, color='lightgray')
intersections.plot(ax=ax, color='red', linewidth=5, capstyle='round')
<AxesSubplot:>